/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.rencanaanggaranpendapatanuangujiantugasakhirkuliahkerjanyatawisuda;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.sadhar.sia.common.ClassSession;
import org.sadhar.sia.common.ClassUtility;
import org.sadhar.sia.framework.ClassApplicationModule;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Doublebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Space;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Toolbarbutton;

/**
 * Digunakan untuk menangani komponen rencanaanggaranpendapatanuangujianakhirkuliahkerjanyatawisuda.RencanaAnggaranPendapatanUangUjianTugasAkhirKuliahKerjaNyataWisuda.zul
 * @author kris
 */
public class RencananAnggaranPendapatanUKWWnd extends ClassApplicationModule {

    private Combobox cmbboxPosPendapatan;
    private Label lblTahunAnggaran;
    private Label lblProgramStudi;
    private Textbox txtboxIdPosPendapatan;
    private Textbox txtboxPeriode;
    private Intbox txtboxPrediksi;
    private Doublebox txtboxTarif;
    private Doublebox txtboxProsentasi;
    private Label lblTotalAnggaranPeriode;
    private Label lblTotalAnggaran;
    private Listbox lstboxPosPendapatanUnit;
    private Listbox lstboxAnggaranPendapatanUnit;
    private RencanaAnggaranPendapatanUKWDAO pendapatanUKWDAO;
    private Textbox txtboxIdPosPendapataAnggaran;
    private DecimalFormat df;
    private DecimalFormat unFormat;
    private ClassSession session;
    private Textbox txtboxIdUnitKerja;
    private int selectedIndex;
    private List<Map> dataSementara = new ArrayList<Map>();
    public boolean simpan = false;
    public boolean cekData = false;
    public boolean edit = false;
    private String oldKomponen = "";
    private Session sesi;

    public RencananAnggaranPendapatanUKWWnd() {
        pendapatanUKWDAO = new RencanaAnggaranPendapatanUKWImpl();
        df = new DecimalFormat("#,##0.00");
        unFormat = new DecimalFormat("#######");
        selectedIndex = 0;
    }

    public void onCreate() throws Exception {
        cmbboxPosPendapatan = (Combobox) getFellow("cmbboxPosPendapatan");
        lblTahunAnggaran = (Label) getFellow("lblTahunAnggaran");
        lblProgramStudi = (Label) getFellow("lblProgramStudi");
        txtboxIdPosPendapatan = (Textbox) getFellow("txtboxIdPosPendapatan");
        txtboxPeriode = (Textbox) getFellow("txtboxPeriode");
        txtboxPrediksi = (Intbox) getFellow("txtboxPrediksi");
        txtboxTarif = (Doublebox) getFellow("txtboxTarif");
        txtboxIdUnitKerja = (Textbox) getFellow("txtboxIdUnitKerja");
        txtboxIdPosPendapataAnggaran = (Textbox) getFellow("txtboxIdPosPendapataAnggaran");
        txtboxProsentasi = (Doublebox) getFellow("txtboxProsentasi");
        lblTotalAnggaranPeriode = (Label) getFellow("lblTotalAnggaranPeriode");
        lblTotalAnggaran = (Label) getFellow("lblTotalAnggaran");
        lstboxPosPendapatanUnit = (Listbox) getFellow("lstboxPosPendapatanUnit");
        lstboxAnggaranPendapatanUnit = (Listbox) getFellow("lstboxAnggaranPendapatanUnit");
        sesi = Sessions.getCurrent();
        session = (ClassSession) sesi.getAttribute("CURRENT_SESSION");
        lblTahunAnggaran.setValue(session.getThnAnggaran());
        loadPosPendapatan();
        //componentDisable();
    }

    /**
     * Digunakan untuk menonaktifkan komponen tertentu
     */
    public void componentDisable() {
        txtboxPeriode.setDisabled(true);
        txtboxPrediksi.setDisabled(true);
        txtboxTarif.setDisabled(true);
        txtboxProsentasi.setDisabled(true);
    }

    /**
     * Digunakan untuk mengaktifkan komponen tertentu
     */
    public void componentEnable() {
        txtboxPeriode.setDisabled(false);
        txtboxPrediksi.setDisabled(false);
        txtboxTarif.setDisabled(false);
        txtboxProsentasi.setDisabled(false);
    }

    /**
     * Digunakan untuk mengisi data pos pendapatan pada komponen cmbboxPosPendapatan
     * @throws Exception
     */
    public void loadPosPendapatan() throws Exception {
        cmbboxPosPendapatan.getItems().clear();
        for (Map map : pendapatanUKWDAO.getPosPendapatan()) {
            Comboitem item = new Comboitem();
            item.setValue(map);
            item.setLabel(map.get("posPendapatan").toString());
            cmbboxPosPendapatan.appendChild(item);
        }
    }

    /**
     * Digunakan untuk mengisi data idPosPendapatan pada saat komponen cmbboxPosPendapatan dipilih
     * @throws Exception
     */
    public void cmbboxPosPendapatanOnSelect() throws Exception {
        Map map = (Map) cmbboxPosPendapatan.getSelectedItem().getValue();
        txtboxIdPosPendapatan.setValue(map.get("idPosPendapatan").toString());
        loadPosPendapatanForListBox();
        loadPosAnggaranPendapatanUnitForListbox();
        //loadPosAnggaranPendapatanUnitForListbox();
        /*try {
        Map pendapatanUjianAkhir = pendapatanUKWDAO.getAnggaranPendapatanUjianAkhirKKN(session.getThnAnggaran(), Integer.valueOf(txtboxIdPosPendapatan.getValue().toString()));
        txtboxPeriode.setValue(pendapatanUjianAkhir.get("periode").toString());
        txtboxPrediksi.setValue(pendapatanUjianAkhir.get("prediksiJmlMhsYgUjian").toString());
        txtboxTarif.setValue(pendapatanUjianAkhir.get("tarif").toString());
        txtboxProsentasi.setValue(pendapatanUjianAkhir.get("prosentase").toString());
        Float totalPeriode = Float.valueOf(pendapatanUjianAkhir.get("prediksiJmlMhsYgUjian").toString()) * Float.valueOf(pendapatanUjianAkhir.get("tarif").toString()) * (Float.valueOf(pendapatanUjianAkhir.get("prosentase").toString()) / 100);
        lblTotalAnggaranPeriode.setValue(ClassUtility.formatMoney(totalPeriode));
        Integer total = pendapatanUKWDAO.getTotalAnggaran(session.getThnAnggaran(), Integer.valueOf(txtboxIdPosPendapatan.getValue().toString()));
        lblTotalAnggaran.setValue(ClassUtility.formatMoney(total));
        } catch (Exception e) {
        txtboxPeriode.setValue(null);
        txtboxPrediksi.setValue(null);
        txtboxTarif.setValue(null);
        txtboxProsentasi.setValue(null);
        lblTotalAnggaranPeriode.setValue(null);
        lblTahunAnggaran.setValue(null);
        }*/
    }

    /**
     * Digunakan untuk mengisi data nama unit kerja pada komponen lstboxPosPendapatanUnit
     * @throws Exception
     */
    public void loadPosPendapatanForListBox() throws Exception {
        lstboxPosPendapatanUnit.getItems().clear();
        List<Map> resutl = pendapatanUKWDAO.getUnitKerja(session.getThnAnggaran(), Integer.valueOf(txtboxIdPosPendapatan.getValue().toString()));
        dataSementara = resutl;
        for (Map m : resutl) {
            Listitem item = new Listitem();
            item.setValue(m);
            item.appendChild(new Listcell(m.get("Nama_unit_kerja").toString()));
            Listcell listcell = new Listcell();
            Checkbox checkbox = new Checkbox();
            checkbox.setDisabled(true);
            checkbox.setChecked(true);
            listcell.appendChild(checkbox);
            item.appendChild(listcell);
            lstboxPosPendapatanUnit.appendChild(item);
        }
    }

    /**
     * Digunakan untuk mengisi data nama unit kerja(prodi),periode, prediksi jumlah mahasiswa,
     * tarif, prosentase pada komponen lstboxAnggaranPendapatanUnit
     * @throws Exception
     */
    public void loadPosAnggaranPendapatanUnitForListbox() throws Exception {
        lstboxAnggaranPendapatanUnit.getItems().clear();
        for (final Map pendapatanUjianAkhir : pendapatanUKWDAO.getAnggaranPendapatanUjianAkhirKKN(session.getThnAnggaran(), Integer.valueOf(txtboxIdPosPendapatan.getValue().toString()))) {
            Listitem item = new Listitem();
            item.setValue(pendapatanUjianAkhir);
//            item.appendChild(new Listcell(pendapatanUjianAkhir.get("Nama_unit_kerja").toString()));
            //
            if (oldKomponen.equalsIgnoreCase(pendapatanUjianAkhir.get("Nama_unit_kerja").toString())) {
                item.appendChild(new Listcell(""));
            } else {
                item.appendChild(new Listcell(pendapatanUjianAkhir.get("Nama_unit_kerja").toString()));
                oldKomponen = pendapatanUjianAkhir.get("Nama_unit_kerja").toString();
            }
            //
            //
            item.appendChild(new Listcell(pendapatanUjianAkhir.get("periode").toString()));
            item.appendChild(new Listcell(pendapatanUjianAkhir.get("prediksiJmlMhsYgUjian").toString()));
            item.appendChild(new Listcell(df.format(Float.valueOf(pendapatanUjianAkhir.get("tarif").toString()))));
            item.appendChild(new Listcell(pendapatanUjianAkhir.get("prosentase").toString()));
            //
            double jmlMhs = 0;
            double tarif = 0;
            double persen = 0;
            double total = 0;
            jmlMhs = Double.parseDouble(pendapatanUjianAkhir.get("prediksiJmlMhsYgUjian").toString());
            tarif = Double.parseDouble(pendapatanUjianAkhir.get("tarif").toString());
            persen = Double.parseDouble(pendapatanUjianAkhir.get("prosentase").toString());
            total = (jmlMhs * tarif * persen) / 100;
            item.appendChild(new Listcell(String.valueOf(df.format(total))));
            //
            Listcell listcell = new Listcell();
            Toolbarbutton toolbarbtnUbah = new Toolbarbutton();
            toolbarbtnUbah.setLabel("[ubah]");
            toolbarbtnUbah.addEventListener("onClick", new org.zkoss.zk.ui.event.EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    edit = true;
                    //componentEnable();
                    lblProgramStudi.setValue(pendapatanUjianAkhir.get("Nama_unit_kerja").toString());
                    txtboxPeriode.setValue(pendapatanUjianAkhir.get("periode").toString());
                    txtboxPeriode.setReadonly(true);
                    txtboxPrediksi.setValue(Integer.valueOf(pendapatanUjianAkhir.get("prediksiJmlMhsYgUjian").toString()));
                    txtboxTarif.setValue(Double.valueOf(unFormat.format(Float.valueOf(pendapatanUjianAkhir.get("tarif").toString()))));
                    txtboxProsentasi.setValue(Double.valueOf(pendapatanUjianAkhir.get("prosentase").toString()));
                    Float totalPeriode = Float.valueOf(pendapatanUjianAkhir.get("prediksiJmlMhsYgUjian").toString()) * Float.valueOf(pendapatanUjianAkhir.get("tarif").toString()) * (Float.valueOf(pendapatanUjianAkhir.get("prosentase").toString()) / 100);
                    lblTotalAnggaranPeriode.setValue(df.format(totalPeriode));
                    Integer total = pendapatanUKWDAO.getTotalAnggaran(session.getThnAnggaran(), Integer.valueOf(pendapatanUjianAkhir.get("idPosAnggaranPendapatanUnit").toString()));
                    lblTotalAnggaran.setValue(df.format(total));
                    txtboxIdPosPendapataAnggaran.setValue(pendapatanUjianAkhir.get("idPosAnggaranPendapatanUnit").toString());
//                    txtboxIdUnitKerja.setValue(pendapatanUjianAkhir.get("Kd_unit_kerja").toString());
                }
            });

            Toolbarbutton toolbarbtnHapus = new Toolbarbutton();
            toolbarbtnHapus.setLabel("[hapus]");
            toolbarbtnHapus.addEventListener("onClick", new org.zkoss.zk.ui.event.EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    pendapatanUKWDAO.delete(Integer.valueOf(pendapatanUjianAkhir.get("idPosAnggaranPendapatanUnit").toString()), session.getThnAnggaran(), pendapatanUjianAkhir.get("periode").toString());
                    Messagebox.show("Data sudah dihapus", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
                    loadPosAnggaranPendapatanUnitForListbox();
                    clearAll();
                }
            });

            listcell.appendChild(toolbarbtnUbah);
            listcell.appendChild(new Space());
            listcell.appendChild(toolbarbtnHapus);
            listcell.appendChild(new Space());
            item.appendChild(listcell);
            lstboxAnggaranPendapatanUnit.appendChild(item);
        }
    }

    /**
     * Digunakan untuk menangani event pada saat komponen lstboxPosPendapatanUnit diplih
     * @throws Exception
     */
    public void lstboxPosPendapatanUnitOnSelect() throws Exception {
        clearAll();
        Map map = (Map) lstboxPosPendapatanUnit.getSelectedItem().getValue();
        selectedIndex = lstboxPosPendapatanUnit.getSelectedIndex();
        lblProgramStudi.setValue(map.get("Nama_unit_kerja").toString());
        txtboxIdPosPendapataAnggaran.setValue(map.get("idPosAnggaranPendapatanUnit").toString());
//        //COMMENT tgl 19-12-2009
//        Map m = pendapatanUKWDAO.getAnggaranPendapatanUjianAkhirKKN(map.get("tahunAnggaran").toString(),
//                Integer.valueOf(map.get("idPosPendapatan").toString()),
//                Integer.valueOf(map.get("idPosAnggaranPendapatanUnit").toString()));
//
//        if (m.get("idPosPendapatan") == null) {
//            simpan = true;
//            txtboxPeriode.setValue("");
//            lblTotalAnggaran.setValue("0");
//        } else {
//            simpan = false;
//            cekData = true;
//        }
        // tambahan sarah / 19-12-2009
        this.txtboxIdUnitKerja.setValue(map.get("kodeUnitKerja").toString());
        //
        loadPosAnggaranPendapatanUnitForListbox();
    }

    /**
     * Digunakan untuk melakukan penyimpanan data rencana anggaran pendapatan uang kkn, wisuda dan tugas akhir
     * @throws InterruptedException
     * @throws Exception
     */
    public void btnSimpanOnClick() throws InterruptedException, Exception {
        // REVISIED sarah (BAPSI) / 19/20-12-2009
        if (txtboxPeriode.getValue().toString().equals("")
                || txtboxPrediksi.getValue() == null
                || txtboxProsentasi.getValue() == null
                || txtboxTarif.getValue() == null
                || txtboxIdPosPendapatan.getValue().toString().equals("")) {
            Messagebox.show("Data tidak lengkap", "Pesan Kesalahan", Messagebox.YES, Messagebox.ERROR);
            return;
        }
        // SETTING OBJECT
        RencanaAnggaranPendapatanUKW rapukw = new RencanaAnggaranPendapatanUKW();
        rapukw.setPeriode(txtboxPeriode.getValue());
        rapukw.setTahunAnggaran(session.getThnAnggaran());
        rapukw.setPrediksiJmlYgUjian(Integer.valueOf(txtboxPrediksi.getValue().toString()));
        rapukw.setProsentase(Float.valueOf(txtboxProsentasi.getValue().toString()));
        rapukw.setTarif(Float.valueOf(txtboxTarif.getValue().toString()));
        rapukw.setIdPosAnggaranPendapatanUnit(Integer.valueOf(txtboxIdPosPendapataAnggaran.getValue().toString()));
        // INSERT
        if (edit == false) {
            //
            Map map = (Map) lstboxPosPendapatanUnit.getSelectedItem().getValue();
            selectedIndex = lstboxPosPendapatanUnit.getSelectedIndex();
            Map m = pendapatanUKWDAO.getAnggaranPendapatanUjianAkhirKKN(map.get("tahunAnggaran").toString(),
                    Integer.valueOf(map.get("idPosPendapatan").toString()),
                    Integer.valueOf(map.get("idPosAnggaranPendapatanUnit").toString()),
                    this.txtboxPeriode.getValue());
            if (m.get("periode") == null) {
                simpan = true;
            } else {
                simpan = false;
            }

            if (simpan == true) {
                try {
                    pendapatanUKWDAO.insert(rapukw);
                    Messagebox.show("Data sudah simpan", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
                    loadPosAnggaranPendapatanUnitForListbox();
                    edit = false;
                    this.txtboxPeriode.setReadonly(false);
//                    this.txtboxIdUnitKerja.setValue("");
//                    return;
                } catch (Exception e) {
                    Messagebox.show("Gagal menyimpan data " + e.getMessage(), "Pesan Kesalahan", Messagebox.YES, Messagebox.ERROR);
                }
            } else {
                Messagebox.show("Data sudah Ada ", "Pesan Kesalahan", Messagebox.YES, Messagebox.ERROR);
            }
        } //UPDATE
        else {
            try {
                pendapatanUKWDAO.update(rapukw);
                Messagebox.show("Data sudah ubah", "Informasi", Messagebox.YES, Messagebox.INFORMATION);
                loadPosAnggaranPendapatanUnitForListbox();
                edit = false;
                this.txtboxPeriode.setReadonly(false);
//                this.txtboxIdUnitKerja.setValue("");
//                return;
            } catch (Exception e) {
                Messagebox.show("Gagal menyimpan data " + e.getMessage(), "Pesan Kesalahan", Messagebox.YES, Messagebox.ERROR);
            }
        }
    }

    /**
     * Digunakan untuk menangani event btnBatal pada saat diklik
     */
    public void btnBatalOnClick() {
        clearAll();
        //componentDisable();
    }

    public void clearAll() {
        // REVISIED sarah (BAPSI) / 19/20-12-2009
        lblTotalAnggaran.setValue(null);
        lblTotalAnggaranPeriode.setValue(null);
        txtboxPeriode.setValue(null);
        txtboxPrediksi.setValue(null);
        txtboxProsentasi.setValue(null);
        txtboxTarif.setValue(null);
        edit = false;
//        lstboxPosPendapatanUnit.getItems().clear();
//        txtboxIdPosPendapataAnggaran.setValue(null);
//        lblProgramStudi.setValue(null);
        txtboxPeriode.setReadonly(false);
//        this.txtboxIdUnitKerja.setValue(null);
    }

    /**
     * Digunakan untuk meimindahkan kursor pada baris berikutnya pada komponen lstboxPosPendapatanUnit
     */
    public void btnNextOnClick() {
        if (selectedIndex < dataSementara.size() - 1) {
            ++selectedIndex;
            lstboxPosPendapatanUnit.setSelectedIndex(selectedIndex);
            Map map = dataSementara.get(selectedIndex);
            lblProgramStudi.setValue(map.get("Nama_unit_kerja").toString());
        }

    }

    /**
     * Digunakan untuk untuk memindahkan kursor pada baris sebelumnya pada komponen lstboxPosPendapatanUnit
     */
    public void btnPreviousOnClick() {
        if (selectedIndex > 0) {
            --selectedIndex;
            lstboxPosPendapatanUnit.setSelectedIndex(selectedIndex);
            Map map = dataSementara.get(selectedIndex);
            lblProgramStudi.setValue(map.get("Nama_unit_kerja").toString());
        }

    }
    // revisied by : sarah (BAPSI), tgl 19-12-2009

    /**
     * Digunakan untuk menghitung total anggaran
     */
    public void HitungTotalAnggaran() {
        // hitung total anggaran per periode
        double totalPeroide = (this.txtboxPrediksi.getValue() * this.txtboxTarif.getValue() * this.txtboxProsentasi.getValue()) / 100;
        this.lblTotalAnggaranPeriode.setValue(ClassUtility.formatMoney(totalPeroide));
        // hitung total anggaran per tahun anggaran, kode unit kerja, pos pendapatan
        double totalAnggaran = pendapatanUKWDAO.getTotalAnggaran2(session.getThnAnggaran(), Integer.valueOf(txtboxIdPosPendapatan.getValue().toString()), this.txtboxIdUnitKerja.getValue(), this.txtboxPeriode.getValue());
        lblTotalAnggaran.setValue(ClassUtility.formatMoney(totalAnggaran + totalPeroide));
    }
}
